In [3]:
import tensorflow as tf
from tensorflow.keras import models, layers
import matplotlib.pyplot as plt
import numpy as np
import pathlib
import os

# Set all the Constants
Image_Size = 256
Batch_Size = 32
Channels = 3
Epochs = 30

# Set the dataset path
dataset_dir = r'D:\Minor-Sem-4\PlantVillage_dataset'

# Import data into tensorflow dataset object
dataset = tf.keras.preprocessing.image_dataset_from_directory(
    dataset_dir,
    batch_size=Batch_Size,
    image_size=(Image_Size, Image_Size),
    shuffle=True
)

# Extract class names
class_name = dataset.class_names

# Split Dataset
def get_dataset_partitions_tf(ds, train_split=0.8, val_split=0.1, test_split=0.1, shuffle=True, shuffle_size=10000):
    assert (train_split + test_split + val_split) == 1

    ds_size = len(ds)
    if shuffle:
        ds = ds.shuffle(shuffle_size, seed=12)
    train_size = int(train_split * ds_size)
    val_size = int(val_split * ds_size)
    train_ds = ds.take(train_size)
    val_ds = ds.skip(train_size).take(val_size)
    test_ds = ds.skip(train_size).skip(val_size)
    return train_ds, val_ds, test_ds

train_ds, val_ds, test_ds = get_dataset_partitions_tf(dataset)

# Cache, Shuffle, and Prefetch the Dataset
train_ds = train_ds.cache().shuffle(1000).prefetch(buffer_size=tf.data.AUTOTUNE)
val_ds = val_ds.cache().shuffle(1000).prefetch(buffer_size=tf.data.AUTOTUNE)
test_ds = test_ds.cache().shuffle(1000).prefetch(buffer_size=tf.data.AUTOTUNE)

# Building the Model
resize_and_rescale = tf.keras.Sequential([
    layers.Resizing(Image_Size, Image_Size),
    layers.Rescaling(1./255),
])

data_augmentation = tf.keras.Sequential([
    layers.RandomFlip("horizontal_and_vertical"),
    layers.RandomRotation(0.2),
])

input_shape = (Image_Size, Image_Size, Channels)
batch_input_shape = (Batch_Size, Image_Size, Image_Size, Channels)
n_classes = len(class_name)

model = models.Sequential([
    resize_and_rescale,
    data_augmentation,
    layers.Conv2D(32, kernel_size=(3, 3), activation='relu', input_shape=input_shape),
    layers.MaxPooling2D((2, 2)),
    layers.Conv2D(64, kernel_size=(3, 3), activation='relu'),
    layers.MaxPooling2D((2, 2)),
    layers.Conv2D(64, kernel_size=(3, 3), activation='relu'),
    layers.MaxPooling2D((2, 2)),
    layers.Conv2D(64, kernel_size=(3, 3), activation='relu'),
    layers.MaxPooling2D((2, 2)),
    layers.Conv2D(64, kernel_size=(3, 3), activation='relu'),
    layers.MaxPooling2D((2, 2)),
    layers.Conv2D(64, kernel_size=(3, 3), activation='relu'),
    layers.MaxPooling2D((2, 2)),
    layers.Flatten(),
    layers.Dense(64, activation='relu'),
    layers.Dense(n_classes, activation='softmax'),
])

model.build(input_shape=batch_input_shape)
model.summary()

# Compile the model
model.compile(
    optimizer='adam',
    loss=tf.keras.losses.SparseCategoricalCrossentropy(from_logits=False),
    metrics=['accuracy']
)
Found 2152 files belonging to 3 classes.
Model: "sequential_5"
_________________________________________________________________
 Layer (type)                Output Shape              Param #   
=================================================================
 sequential_3 (Sequential)   (32, 256, 256, 3)         0         
                                                                 
 sequential_4 (Sequential)   (32, 256, 256, 3)         0         
                                                                 
 conv2d_6 (Conv2D)           (32, 254, 254, 32)        896       
                                                                 
 max_pooling2d_6 (MaxPoolin  (32, 127, 127, 32)        0         
 g2D)                                                            
                                                                 
 conv2d_7 (Conv2D)           (32, 125, 125, 64)        18496     
                                                                 
 max_pooling2d_7 (MaxPoolin  (32, 62, 62, 64)          0         
 g2D)                                                            
                                                                 
 conv2d_8 (Conv2D)           (32, 60, 60, 64)          36928     
                                                                 
 max_pooling2d_8 (MaxPoolin  (32, 30, 30, 64)          0         
 g2D)                                                            
                                                                 
 conv2d_9 (Conv2D)           (32, 28, 28, 64)          36928     
                                                                 
 max_pooling2d_9 (MaxPoolin  (32, 14, 14, 64)          0         
 g2D)                                                            
                                                                 
 conv2d_10 (Conv2D)          (32, 12, 12, 64)          36928     
                                                                 
 max_pooling2d_10 (MaxPooli  (32, 6, 6, 64)            0         
 ng2D)                                                           
                                                                 
 conv2d_11 (Conv2D)          (32, 4, 4, 64)            36928     
                                                                 
 max_pooling2d_11 (MaxPooli  (32, 2, 2, 64)            0         
 ng2D)                                                           
                                                                 
 flatten_1 (Flatten)         (32, 256)                 0         
                                                                 
 dense_2 (Dense)             (32, 64)                  16448     
                                                                 
 dense_3 (Dense)             (32, 3)                   195       
                                                                 
=================================================================
Total params: 183747 (717.76 KB)
Trainable params: 183747 (717.76 KB)
Non-trainable params: 0 (0.00 Byte)
_________________________________________________________________
In [7]:
import visualkeras
visualkeras.layered_view(model, legend=True, scale_xy=0.8)
Out[7]:
In [4]:
# Train the model
history = model.fit(
    train_ds,
    batch_size=Batch_Size,
    validation_data=val_ds,
    verbose=1,
    epochs=Epochs,
)

# Evaluate the model
print("[INFO] Calculating model accuracy")
scores = model.evaluate(test_ds)
print(f"Test Accuracy: {round(scores[1], 4) * 100}%")

# Plot training history
acc = history.history['accuracy']
val_acc = history.history['val_accuracy']
loss = history.history['loss']
val_loss = history.history['val_loss']
epochs_range = range(Epochs)

plt.figure(figsize=(8, 8))
plt.subplot(1, 2, 1)
plt.plot(epochs_range, acc, label='Training Accuracy')
plt.plot(epochs_range, val_acc, label='Validation Accuracy')
plt.legend(loc='lower right')
plt.title('Training and Validation Accuracy')

plt.subplot(1, 2, 2)
plt.plot(epochs_range, loss, label='Training Loss')
plt.plot(epochs_range, val_loss, label='Validation Loss')
plt.legend(loc='upper right')
plt.title('Training and Validation Loss')
plt.show()

# Model Prediction
def predict(model, img):
    img_array = tf.keras.preprocessing.image.img_to_array(images[i].numpy())
    img_array = tf.expand_dims(img_array, 0) 
    predictions = model.predict(img_array)
    predicted_class = class_name[np.argmax(predictions[0])]
    confidence = round(100 * (np.max(predictions[0])), 2)
    return predicted_class, confidence

plt.figure(figsize=(20, 20))
for images, labels in test_ds.take(1):
    for i in range(9):
        ax = plt.subplot(3, 3, i + 1)
        plt.imshow(images[i].numpy().astype("uint8"))
        predicted_class, confidence = predict(model, images[i].numpy())       
        actual_class = class_name[labels[i]] 
        plt.title(f"Actual: {actual_class}, Predicted: {predicted_class}. Confidence: {confidence}%")
        plt.axis("off")
Epoch 1/30
54/54 [==============================] - 101s 2s/step - loss: 0.9088 - accuracy: 0.4728 - val_loss: 0.8833 - val_accuracy: 0.6094
Epoch 2/30
54/54 [==============================] - 92s 2s/step - loss: 0.8395 - accuracy: 0.6100 - val_loss: 0.7727 - val_accuracy: 0.6927
Epoch 3/30
54/54 [==============================] - 89s 2s/step - loss: 0.6755 - accuracy: 0.7240 - val_loss: 0.5733 - val_accuracy: 0.7812
Epoch 4/30
54/54 [==============================] - 87s 2s/step - loss: 0.4476 - accuracy: 0.8194 - val_loss: 0.3632 - val_accuracy: 0.8594
Epoch 5/30
54/54 [==============================] - 88s 2s/step - loss: 0.3731 - accuracy: 0.8409 - val_loss: 0.3442 - val_accuracy: 0.8958
Epoch 6/30
54/54 [==============================] - 89s 2s/step - loss: 0.2951 - accuracy: 0.8837 - val_loss: 0.4752 - val_accuracy: 0.7969
Epoch 7/30
54/54 [==============================] - 88s 2s/step - loss: 0.2536 - accuracy: 0.9005 - val_loss: 0.6679 - val_accuracy: 0.7812
Epoch 8/30
54/54 [==============================] - 88s 2s/step - loss: 0.2972 - accuracy: 0.8860 - val_loss: 0.1770 - val_accuracy: 0.9427
Epoch 9/30
54/54 [==============================] - 94s 2s/step - loss: 0.2202 - accuracy: 0.9167 - val_loss: 0.3606 - val_accuracy: 0.8594
Epoch 10/30
54/54 [==============================] - 87s 2s/step - loss: 0.1922 - accuracy: 0.9317 - val_loss: 0.2202 - val_accuracy: 0.9271
Epoch 11/30
54/54 [==============================] - 87s 2s/step - loss: 0.1907 - accuracy: 0.9306 - val_loss: 0.1342 - val_accuracy: 0.9479
Epoch 12/30
54/54 [==============================] - 86s 2s/step - loss: 0.1586 - accuracy: 0.9468 - val_loss: 0.1385 - val_accuracy: 0.9479
Epoch 13/30
54/54 [==============================] - 89s 2s/step - loss: 0.1537 - accuracy: 0.9462 - val_loss: 0.5121 - val_accuracy: 0.8542
Epoch 14/30
54/54 [==============================] - 87s 2s/step - loss: 0.1031 - accuracy: 0.9630 - val_loss: 0.3086 - val_accuracy: 0.9115
Epoch 15/30
54/54 [==============================] - 87s 2s/step - loss: 0.1213 - accuracy: 0.9595 - val_loss: 0.0489 - val_accuracy: 0.9844
Epoch 16/30
54/54 [==============================] - 88s 2s/step - loss: 0.1147 - accuracy: 0.9543 - val_loss: 0.4511 - val_accuracy: 0.8490
Epoch 17/30
54/54 [==============================] - 90s 2s/step - loss: 0.2449 - accuracy: 0.9132 - val_loss: 0.0988 - val_accuracy: 0.9740
Epoch 18/30
54/54 [==============================] - 88s 2s/step - loss: 0.0694 - accuracy: 0.9774 - val_loss: 0.0325 - val_accuracy: 0.9896
Epoch 19/30
54/54 [==============================] - 91s 2s/step - loss: 0.0658 - accuracy: 0.9769 - val_loss: 0.1918 - val_accuracy: 0.9062
Epoch 20/30
54/54 [==============================] - 89s 2s/step - loss: 0.0820 - accuracy: 0.9734 - val_loss: 0.0298 - val_accuracy: 0.9896
Epoch 21/30
54/54 [==============================] - 87s 2s/step - loss: 0.0676 - accuracy: 0.9797 - val_loss: 0.0594 - val_accuracy: 0.9844
Epoch 22/30
54/54 [==============================] - 89s 2s/step - loss: 0.0436 - accuracy: 0.9873 - val_loss: 0.0094 - val_accuracy: 1.0000
Epoch 23/30
54/54 [==============================] - 89s 2s/step - loss: 0.0480 - accuracy: 0.9838 - val_loss: 0.0477 - val_accuracy: 0.9740
Epoch 24/30
54/54 [==============================] - 88s 2s/step - loss: 0.0398 - accuracy: 0.9884 - val_loss: 0.0373 - val_accuracy: 0.9896
Epoch 25/30
54/54 [==============================] - 89s 2s/step - loss: 0.0905 - accuracy: 0.9682 - val_loss: 0.0406 - val_accuracy: 0.9792
Epoch 26/30
54/54 [==============================] - 90s 2s/step - loss: 0.0354 - accuracy: 0.9907 - val_loss: 0.0101 - val_accuracy: 1.0000
Epoch 27/30
54/54 [==============================] - 89s 2s/step - loss: 0.0311 - accuracy: 0.9925 - val_loss: 0.0099 - val_accuracy: 1.0000
Epoch 28/30
54/54 [==============================] - 86s 2s/step - loss: 0.0268 - accuracy: 0.9907 - val_loss: 0.0048 - val_accuracy: 1.0000
Epoch 29/30
54/54 [==============================] - 211s 4s/step - loss: 0.0598 - accuracy: 0.9809 - val_loss: 0.0760 - val_accuracy: 0.9688
Epoch 30/30
54/54 [==============================] - 266s 5s/step - loss: 0.0452 - accuracy: 0.9850 - val_loss: 0.0080 - val_accuracy: 1.0000
[INFO] Calculating model accuracy
8/8 [==============================] - 10s 609ms/step - loss: 0.0246 - accuracy: 0.9922
Test Accuracy: 99.22%
1/1 [==============================] - 1s 1s/step
1/1 [==============================] - 0s 64ms/step
1/1 [==============================] - 0s 78ms/step
1/1 [==============================] - 0s 79ms/step
1/1 [==============================] - 0s 63ms/step
1/1 [==============================] - 0s 78ms/step
1/1 [==============================] - 0s 126ms/step
1/1 [==============================] - 0s 78ms/step
1/1 [==============================] - 0s 78ms/step
In [10]:
from sklearn.metrics import classification_report, confusion_matrix

# Generate predictions for the test set
test_images = []
test_labels = []
predicted_labels = []
for images, labels in test_ds:
    for i in range(len(images)):
        test_images.append(images[i].numpy())
        test_labels.append(labels[i].numpy())
        predicted_class, _ = predict(model, images[i].numpy())
        predicted_labels.append(class_name.index(predicted_class))

# Calculate metrics
test_loss, test_accuracy = model.evaluate(test_ds)
print(f"Test Loss: {test_loss}")
print(f"Test Accuracy: {test_accuracy}")

# Generate classification report
print("Classification Report:")
print(classification_report(test_labels, predicted_labels, target_names=class_name))

import seaborn as sns

# Plot confusion matrix
plt.figure(figsize=(10, 8))
sns.heatmap(conf_matrix, annot=True, fmt='d', cmap='Blues', xticklabels=class_name, yticklabels=class_name)
plt.title('Confusion Matrix')
plt.xlabel('Predicted Labels')
plt.ylabel('True Labels')
plt.show()


# Plot separate accuracy and loss curves
plt.figure(figsize=(12, 6))

plt.subplot(1, 2, 1)
plt.plot(epochs_range, acc, label='Training Accuracy')
plt.plot(epochs_range, val_acc, label='Validation Accuracy')
plt.xlabel('Epochs')
plt.ylabel('Accuracy')
plt.title('Training and Validation Accuracy')
plt.legend()

plt.subplot(1, 2, 2)
plt.plot(epochs_range, loss, label='Training Loss')
plt.plot(epochs_range, val_loss, label='Validation Loss')
plt.xlabel('Epochs')
plt.ylabel('Loss')
plt.title('Training and Validation Loss')
plt.legend()

plt.tight_layout()
plt.show()
1/1 [==============================] - 0s 67ms/step
1/1 [==============================] - 0s 55ms/step
1/1 [==============================] - 0s 72ms/step
1/1 [==============================] - 0s 73ms/step
1/1 [==============================] - 0s 72ms/step
1/1 [==============================] - 0s 74ms/step
1/1 [==============================] - 0s 78ms/step
1/1 [==============================] - 0s 70ms/step
1/1 [==============================] - 0s 62ms/step
1/1 [==============================] - 0s 73ms/step
1/1 [==============================] - 0s 68ms/step
1/1 [==============================] - 0s 76ms/step
1/1 [==============================] - 0s 76ms/step
1/1 [==============================] - 0s 71ms/step
1/1 [==============================] - 0s 77ms/step
1/1 [==============================] - 0s 82ms/step
1/1 [==============================] - 0s 74ms/step
1/1 [==============================] - 0s 71ms/step
1/1 [==============================] - 0s 81ms/step
1/1 [==============================] - 0s 72ms/step
1/1 [==============================] - 0s 72ms/step
1/1 [==============================] - 0s 74ms/step
1/1 [==============================] - 0s 70ms/step
1/1 [==============================] - 0s 72ms/step
1/1 [==============================] - 0s 69ms/step
1/1 [==============================] - 0s 71ms/step
1/1 [==============================] - 0s 69ms/step
1/1 [==============================] - 0s 70ms/step
1/1 [==============================] - 0s 68ms/step
1/1 [==============================] - 0s 67ms/step
1/1 [==============================] - 0s 63ms/step
1/1 [==============================] - 0s 66ms/step
1/1 [==============================] - 0s 68ms/step
1/1 [==============================] - 0s 77ms/step
1/1 [==============================] - 0s 64ms/step
1/1 [==============================] - 0s 64ms/step
1/1 [==============================] - 0s 65ms/step
1/1 [==============================] - 0s 71ms/step
1/1 [==============================] - 0s 56ms/step
1/1 [==============================] - 0s 61ms/step
1/1 [==============================] - 0s 62ms/step
1/1 [==============================] - 0s 62ms/step
1/1 [==============================] - 0s 69ms/step
1/1 [==============================] - 0s 72ms/step
1/1 [==============================] - 0s 60ms/step
1/1 [==============================] - 0s 61ms/step
1/1 [==============================] - 0s 58ms/step
1/1 [==============================] - 0s 72ms/step
1/1 [==============================] - 0s 64ms/step
1/1 [==============================] - 0s 64ms/step
1/1 [==============================] - 0s 62ms/step
1/1 [==============================] - 0s 68ms/step
1/1 [==============================] - 0s 73ms/step
1/1 [==============================] - 0s 75ms/step
1/1 [==============================] - 0s 63ms/step
1/1 [==============================] - 0s 62ms/step
1/1 [==============================] - 0s 68ms/step
1/1 [==============================] - 0s 69ms/step
1/1 [==============================] - 0s 80ms/step
1/1 [==============================] - 0s 55ms/step
1/1 [==============================] - 0s 79ms/step
1/1 [==============================] - 0s 72ms/step
1/1 [==============================] - 0s 64ms/step
1/1 [==============================] - 0s 69ms/step
1/1 [==============================] - 0s 71ms/step
1/1 [==============================] - 0s 60ms/step
1/1 [==============================] - 0s 62ms/step
1/1 [==============================] - 0s 68ms/step
1/1 [==============================] - 0s 63ms/step
1/1 [==============================] - 0s 71ms/step
1/1 [==============================] - 0s 67ms/step
1/1 [==============================] - 0s 69ms/step
1/1 [==============================] - 0s 73ms/step
1/1 [==============================] - 0s 69ms/step
1/1 [==============================] - 0s 56ms/step
1/1 [==============================] - 0s 67ms/step
1/1 [==============================] - 0s 71ms/step
1/1 [==============================] - 0s 79ms/step
1/1 [==============================] - 0s 72ms/step
1/1 [==============================] - 0s 74ms/step
1/1 [==============================] - 0s 72ms/step
1/1 [==============================] - 0s 69ms/step
1/1 [==============================] - 0s 72ms/step
1/1 [==============================] - 0s 55ms/step
1/1 [==============================] - 0s 72ms/step
1/1 [==============================] - 0s 65ms/step
1/1 [==============================] - 0s 62ms/step
1/1 [==============================] - 0s 59ms/step
1/1 [==============================] - 0s 75ms/step
1/1 [==============================] - 0s 77ms/step
1/1 [==============================] - 0s 64ms/step
1/1 [==============================] - 0s 72ms/step
1/1 [==============================] - 0s 71ms/step
1/1 [==============================] - 0s 65ms/step
1/1 [==============================] - 0s 62ms/step
1/1 [==============================] - 0s 60ms/step
1/1 [==============================] - 0s 69ms/step
1/1 [==============================] - 0s 71ms/step
1/1 [==============================] - 0s 71ms/step
1/1 [==============================] - 0s 72ms/step
1/1 [==============================] - 0s 71ms/step
1/1 [==============================] - 0s 71ms/step
1/1 [==============================] - 0s 64ms/step
1/1 [==============================] - 0s 65ms/step
1/1 [==============================] - 0s 68ms/step
1/1 [==============================] - 0s 70ms/step
1/1 [==============================] - 0s 63ms/step
1/1 [==============================] - 0s 73ms/step
1/1 [==============================] - 0s 63ms/step
1/1 [==============================] - 0s 74ms/step
1/1 [==============================] - 0s 63ms/step
1/1 [==============================] - 0s 72ms/step
1/1 [==============================] - 0s 55ms/step
1/1 [==============================] - 0s 57ms/step
1/1 [==============================] - 0s 65ms/step
1/1 [==============================] - 0s 62ms/step
1/1 [==============================] - 0s 63ms/step
1/1 [==============================] - 0s 68ms/step
1/1 [==============================] - 0s 63ms/step
1/1 [==============================] - 0s 56ms/step
1/1 [==============================] - 0s 69ms/step
1/1 [==============================] - 0s 71ms/step
1/1 [==============================] - 0s 56ms/step
1/1 [==============================] - 0s 69ms/step
1/1 [==============================] - 0s 69ms/step
1/1 [==============================] - 0s 72ms/step
1/1 [==============================] - 0s 67ms/step
1/1 [==============================] - 0s 69ms/step
1/1 [==============================] - 0s 63ms/step
1/1 [==============================] - 0s 73ms/step
1/1 [==============================] - 0s 77ms/step
1/1 [==============================] - 0s 66ms/step
1/1 [==============================] - 0s 69ms/step
1/1 [==============================] - 0s 64ms/step
1/1 [==============================] - 0s 72ms/step
1/1 [==============================] - 0s 63ms/step
1/1 [==============================] - 0s 70ms/step
1/1 [==============================] - 0s 72ms/step
1/1 [==============================] - 0s 65ms/step
1/1 [==============================] - 0s 73ms/step
1/1 [==============================] - 0s 65ms/step
1/1 [==============================] - 0s 83ms/step
1/1 [==============================] - 0s 58ms/step
1/1 [==============================] - 0s 66ms/step
1/1 [==============================] - 0s 76ms/step
1/1 [==============================] - 0s 72ms/step
1/1 [==============================] - 0s 74ms/step
1/1 [==============================] - 0s 78ms/step
1/1 [==============================] - 0s 82ms/step
1/1 [==============================] - 0s 73ms/step
1/1 [==============================] - 0s 64ms/step
1/1 [==============================] - 0s 69ms/step
1/1 [==============================] - 0s 75ms/step
1/1 [==============================] - 0s 67ms/step
1/1 [==============================] - 0s 64ms/step
1/1 [==============================] - 0s 63ms/step
1/1 [==============================] - 0s 76ms/step
1/1 [==============================] - 0s 63ms/step
1/1 [==============================] - 0s 64ms/step
1/1 [==============================] - 0s 73ms/step
1/1 [==============================] - 0s 72ms/step
1/1 [==============================] - 0s 79ms/step
1/1 [==============================] - 0s 70ms/step
1/1 [==============================] - 0s 64ms/step
1/1 [==============================] - 0s 69ms/step
1/1 [==============================] - 0s 70ms/step
1/1 [==============================] - 0s 84ms/step
1/1 [==============================] - 0s 61ms/step
1/1 [==============================] - 0s 72ms/step
1/1 [==============================] - 0s 66ms/step
1/1 [==============================] - 0s 70ms/step
1/1 [==============================] - 0s 70ms/step
1/1 [==============================] - 0s 80ms/step
1/1 [==============================] - 0s 73ms/step
1/1 [==============================] - 0s 76ms/step
1/1 [==============================] - 0s 71ms/step
1/1 [==============================] - 0s 66ms/step
1/1 [==============================] - 0s 74ms/step
1/1 [==============================] - 0s 72ms/step
1/1 [==============================] - 0s 74ms/step
1/1 [==============================] - 0s 67ms/step
1/1 [==============================] - 0s 70ms/step
1/1 [==============================] - 0s 71ms/step
1/1 [==============================] - 0s 62ms/step
1/1 [==============================] - 0s 84ms/step
1/1 [==============================] - 0s 69ms/step
1/1 [==============================] - 0s 70ms/step
1/1 [==============================] - 0s 75ms/step
1/1 [==============================] - 0s 72ms/step
1/1 [==============================] - 0s 68ms/step
1/1 [==============================] - 0s 67ms/step
1/1 [==============================] - 0s 75ms/step
1/1 [==============================] - 0s 74ms/step
1/1 [==============================] - 0s 61ms/step
1/1 [==============================] - 0s 72ms/step
1/1 [==============================] - 0s 74ms/step
1/1 [==============================] - 0s 70ms/step
1/1 [==============================] - 0s 75ms/step
1/1 [==============================] - 0s 56ms/step
1/1 [==============================] - 0s 70ms/step
1/1 [==============================] - 0s 74ms/step
1/1 [==============================] - 0s 72ms/step
1/1 [==============================] - 0s 73ms/step
1/1 [==============================] - 0s 61ms/step
1/1 [==============================] - 0s 70ms/step
1/1 [==============================] - 0s 69ms/step
1/1 [==============================] - 0s 73ms/step
1/1 [==============================] - 0s 72ms/step
1/1 [==============================] - 0s 71ms/step
1/1 [==============================] - 0s 76ms/step
1/1 [==============================] - 0s 75ms/step
1/1 [==============================] - 0s 77ms/step
1/1 [==============================] - 0s 68ms/step
1/1 [==============================] - 0s 57ms/step
1/1 [==============================] - 0s 66ms/step
1/1 [==============================] - 0s 75ms/step
1/1 [==============================] - 0s 82ms/step
1/1 [==============================] - 0s 68ms/step
1/1 [==============================] - 0s 70ms/step
1/1 [==============================] - 0s 69ms/step
1/1 [==============================] - 0s 75ms/step
1/1 [==============================] - 0s 76ms/step
1/1 [==============================] - 0s 73ms/step
1/1 [==============================] - 0s 80ms/step
1/1 [==============================] - 0s 67ms/step
1/1 [==============================] - 0s 73ms/step
1/1 [==============================] - 0s 101ms/step
1/1 [==============================] - 0s 157ms/step
1/1 [==============================] - 0s 82ms/step
1/1 [==============================] - 0s 83ms/step
1/1 [==============================] - 0s 58ms/step
1/1 [==============================] - 0s 117ms/step
1/1 [==============================] - 0s 68ms/step
1/1 [==============================] - 0s 80ms/step
1/1 [==============================] - 0s 135ms/step
1/1 [==============================] - 0s 83ms/step
1/1 [==============================] - 0s 78ms/step
1/1 [==============================] - 0s 83ms/step
1/1 [==============================] - 0s 72ms/step
1/1 [==============================] - 0s 85ms/step
1/1 [==============================] - 0s 81ms/step
1/1 [==============================] - 0s 82ms/step
1/1 [==============================] - 0s 64ms/step
1/1 [==============================] - 0s 96ms/step
1/1 [==============================] - 0s 60ms/step
1/1 [==============================] - 0s 80ms/step
1/1 [==============================] - 0s 74ms/step
1/1 [==============================] - 0s 71ms/step
1/1 [==============================] - 0s 78ms/step
1/1 [==============================] - 0s 84ms/step
1/1 [==============================] - 0s 77ms/step
1/1 [==============================] - 0s 146ms/step
1/1 [==============================] - 0s 112ms/step
1/1 [==============================] - 0s 77ms/step
1/1 [==============================] - 0s 81ms/step
1/1 [==============================] - 0s 76ms/step
8/8 [==============================] - 10s 1s/step - loss: 0.0246 - accuracy: 0.9922
Test Loss: 0.024592716246843338
Test Accuracy: 0.9921875
Classification Report:
                       precision    recall  f1-score   support

Potato___Early_blight       1.00      0.99      1.00       134
 Potato___Late_blight       0.99      0.99      0.99       106
     Potato___healthy       0.94      1.00      0.97        16

             accuracy                           0.99       256
            macro avg       0.98      0.99      0.99       256
         weighted avg       0.99      0.99      0.99       256

In [9]:
# Count correct and incorrect predictions
correct_predictions = 0
total_predictions = 0
for images, labels in test_ds:
    for i in range(len(images)):
        total_predictions += 1
        predicted_class, _ = predict(model, images[i].numpy())
        if predicted_class == class_name[labels[i]]:
            correct_predictions += 1

# Print correct and incorrect predictions
print("Total predictions:", total_predictions)
print("Correct predictions:", correct_predictions)
print("Incorrect predictions:", total_predictions - correct_predictions)

# Save the model
model.save("plant_disease_model.h5")
print("Model saved successfully.")
1/1 [==============================] - 0s 79ms/step
1/1 [==============================] - 0s 72ms/step
1/1 [==============================] - 0s 72ms/step
1/1 [==============================] - 0s 72ms/step
1/1 [==============================] - 0s 72ms/step
1/1 [==============================] - 0s 73ms/step
1/1 [==============================] - 0s 63ms/step
1/1 [==============================] - 0s 68ms/step
1/1 [==============================] - 0s 73ms/step
1/1 [==============================] - 0s 70ms/step
1/1 [==============================] - 0s 68ms/step
1/1 [==============================] - 0s 71ms/step
1/1 [==============================] - 0s 67ms/step
1/1 [==============================] - 0s 83ms/step
1/1 [==============================] - 0s 65ms/step
1/1 [==============================] - 0s 64ms/step
1/1 [==============================] - 0s 73ms/step
1/1 [==============================] - 0s 71ms/step
1/1 [==============================] - 0s 69ms/step
1/1 [==============================] - 0s 65ms/step
1/1 [==============================] - 0s 65ms/step
1/1 [==============================] - 0s 77ms/step
1/1 [==============================] - 0s 76ms/step
1/1 [==============================] - 0s 71ms/step
1/1 [==============================] - 0s 57ms/step
1/1 [==============================] - 0s 71ms/step
1/1 [==============================] - 0s 73ms/step
1/1 [==============================] - 0s 65ms/step
1/1 [==============================] - 0s 69ms/step
1/1 [==============================] - 0s 77ms/step
1/1 [==============================] - 0s 72ms/step
1/1 [==============================] - 0s 104ms/step
1/1 [==============================] - 0s 78ms/step
1/1 [==============================] - 0s 61ms/step
1/1 [==============================] - 0s 78ms/step
1/1 [==============================] - 0s 65ms/step
1/1 [==============================] - 0s 65ms/step
1/1 [==============================] - 0s 71ms/step
1/1 [==============================] - 0s 72ms/step
1/1 [==============================] - 0s 73ms/step
1/1 [==============================] - 0s 73ms/step
1/1 [==============================] - 0s 77ms/step
1/1 [==============================] - 0s 71ms/step
1/1 [==============================] - 0s 72ms/step
1/1 [==============================] - 0s 63ms/step
1/1 [==============================] - 0s 64ms/step
1/1 [==============================] - 0s 63ms/step
1/1 [==============================] - 0s 73ms/step
1/1 [==============================] - 0s 72ms/step
1/1 [==============================] - 0s 69ms/step
1/1 [==============================] - 0s 62ms/step
1/1 [==============================] - 0s 64ms/step
1/1 [==============================] - 0s 72ms/step
1/1 [==============================] - 0s 66ms/step
1/1 [==============================] - 0s 76ms/step
1/1 [==============================] - 0s 64ms/step
1/1 [==============================] - 0s 74ms/step
1/1 [==============================] - 0s 70ms/step
1/1 [==============================] - 0s 73ms/step
1/1 [==============================] - 0s 77ms/step
1/1 [==============================] - 0s 71ms/step
1/1 [==============================] - 0s 65ms/step
1/1 [==============================] - 0s 72ms/step
1/1 [==============================] - 0s 80ms/step
1/1 [==============================] - 0s 75ms/step
1/1 [==============================] - 0s 64ms/step
1/1 [==============================] - 0s 77ms/step
1/1 [==============================] - 0s 72ms/step
1/1 [==============================] - 0s 69ms/step
1/1 [==============================] - 0s 78ms/step
1/1 [==============================] - 0s 80ms/step
1/1 [==============================] - 0s 73ms/step
1/1 [==============================] - 0s 68ms/step
1/1 [==============================] - 0s 66ms/step
1/1 [==============================] - 0s 73ms/step
1/1 [==============================] - 0s 71ms/step
1/1 [==============================] - 0s 62ms/step
1/1 [==============================] - 0s 63ms/step
1/1 [==============================] - 0s 68ms/step
1/1 [==============================] - 0s 69ms/step
1/1 [==============================] - 0s 63ms/step
1/1 [==============================] - 0s 64ms/step
1/1 [==============================] - 0s 62ms/step
1/1 [==============================] - 0s 67ms/step
1/1 [==============================] - 0s 81ms/step
1/1 [==============================] - 0s 71ms/step
1/1 [==============================] - 0s 71ms/step
1/1 [==============================] - 0s 72ms/step
1/1 [==============================] - 0s 75ms/step
1/1 [==============================] - 0s 63ms/step
1/1 [==============================] - 0s 63ms/step
1/1 [==============================] - 0s 67ms/step
1/1 [==============================] - 0s 79ms/step
1/1 [==============================] - 0s 79ms/step
1/1 [==============================] - 0s 78ms/step
1/1 [==============================] - 0s 64ms/step
1/1 [==============================] - 0s 59ms/step
1/1 [==============================] - 0s 71ms/step
1/1 [==============================] - 0s 63ms/step
1/1 [==============================] - 0s 73ms/step
1/1 [==============================] - 0s 77ms/step
1/1 [==============================] - 0s 73ms/step
1/1 [==============================] - 0s 70ms/step
1/1 [==============================] - 0s 71ms/step
1/1 [==============================] - 0s 73ms/step
1/1 [==============================] - 0s 74ms/step
1/1 [==============================] - 0s 75ms/step
1/1 [==============================] - 0s 72ms/step
1/1 [==============================] - 0s 69ms/step
1/1 [==============================] - 0s 72ms/step
1/1 [==============================] - 0s 73ms/step
1/1 [==============================] - 0s 64ms/step
1/1 [==============================] - 0s 72ms/step
1/1 [==============================] - 0s 72ms/step
1/1 [==============================] - 0s 75ms/step
1/1 [==============================] - 0s 60ms/step
1/1 [==============================] - 0s 69ms/step
1/1 [==============================] - 0s 71ms/step
1/1 [==============================] - 0s 77ms/step
1/1 [==============================] - 0s 64ms/step
1/1 [==============================] - 0s 74ms/step
1/1 [==============================] - 0s 70ms/step
1/1 [==============================] - 0s 73ms/step
1/1 [==============================] - 0s 77ms/step
1/1 [==============================] - 0s 81ms/step
1/1 [==============================] - 0s 57ms/step
1/1 [==============================] - 0s 69ms/step
1/1 [==============================] - 0s 70ms/step
1/1 [==============================] - 0s 71ms/step
1/1 [==============================] - 0s 73ms/step
1/1 [==============================] - 0s 70ms/step
1/1 [==============================] - 0s 64ms/step
1/1 [==============================] - 0s 67ms/step
1/1 [==============================] - 0s 76ms/step
1/1 [==============================] - 0s 63ms/step
1/1 [==============================] - 0s 66ms/step
1/1 [==============================] - 0s 66ms/step
1/1 [==============================] - 0s 73ms/step
1/1 [==============================] - 0s 66ms/step
1/1 [==============================] - 0s 73ms/step
1/1 [==============================] - 0s 79ms/step
1/1 [==============================] - 0s 62ms/step
1/1 [==============================] - 0s 65ms/step
1/1 [==============================] - 0s 79ms/step
1/1 [==============================] - 0s 71ms/step
1/1 [==============================] - 0s 66ms/step
1/1 [==============================] - 0s 64ms/step
1/1 [==============================] - 0s 79ms/step
1/1 [==============================] - 0s 68ms/step
1/1 [==============================] - 0s 74ms/step
1/1 [==============================] - 0s 75ms/step
1/1 [==============================] - 0s 70ms/step
1/1 [==============================] - 0s 70ms/step
1/1 [==============================] - 0s 76ms/step
1/1 [==============================] - 0s 63ms/step
1/1 [==============================] - 0s 78ms/step
1/1 [==============================] - 0s 75ms/step
1/1 [==============================] - 0s 84ms/step
1/1 [==============================] - 0s 72ms/step
1/1 [==============================] - 0s 68ms/step
1/1 [==============================] - 0s 72ms/step
1/1 [==============================] - 0s 85ms/step
1/1 [==============================] - 0s 75ms/step
1/1 [==============================] - 0s 72ms/step
1/1 [==============================] - 0s 73ms/step
1/1 [==============================] - 0s 77ms/step
1/1 [==============================] - 0s 75ms/step
1/1 [==============================] - 0s 61ms/step
1/1 [==============================] - 0s 71ms/step
1/1 [==============================] - 0s 76ms/step
1/1 [==============================] - 0s 67ms/step
1/1 [==============================] - 0s 76ms/step
1/1 [==============================] - 0s 83ms/step
1/1 [==============================] - 0s 81ms/step
1/1 [==============================] - 0s 64ms/step
1/1 [==============================] - 0s 71ms/step
1/1 [==============================] - 0s 79ms/step
1/1 [==============================] - 0s 75ms/step
1/1 [==============================] - 0s 73ms/step
1/1 [==============================] - 0s 75ms/step
1/1 [==============================] - 0s 75ms/step
1/1 [==============================] - 0s 71ms/step
1/1 [==============================] - 0s 75ms/step
1/1 [==============================] - 0s 84ms/step
1/1 [==============================] - 0s 87ms/step
1/1 [==============================] - 0s 128ms/step
1/1 [==============================] - 0s 82ms/step
1/1 [==============================] - 0s 145ms/step
1/1 [==============================] - 0s 95ms/step
1/1 [==============================] - 0s 100ms/step
1/1 [==============================] - 0s 173ms/step
1/1 [==============================] - 0s 137ms/step
1/1 [==============================] - 0s 78ms/step
1/1 [==============================] - 0s 72ms/step
1/1 [==============================] - 0s 148ms/step
1/1 [==============================] - 0s 97ms/step
1/1 [==============================] - 0s 79ms/step
1/1 [==============================] - 0s 167ms/step
1/1 [==============================] - 0s 66ms/step
1/1 [==============================] - 0s 73ms/step
1/1 [==============================] - 0s 74ms/step
1/1 [==============================] - 0s 94ms/step
1/1 [==============================] - 0s 71ms/step
1/1 [==============================] - 0s 111ms/step
1/1 [==============================] - 0s 83ms/step
1/1 [==============================] - 0s 80ms/step
1/1 [==============================] - 0s 78ms/step
1/1 [==============================] - 0s 72ms/step
1/1 [==============================] - 0s 55ms/step
1/1 [==============================] - 0s 80ms/step
1/1 [==============================] - 0s 73ms/step
1/1 [==============================] - 0s 72ms/step
1/1 [==============================] - 0s 73ms/step
1/1 [==============================] - 0s 72ms/step
1/1 [==============================] - 0s 71ms/step
1/1 [==============================] - 0s 75ms/step
1/1 [==============================] - 0s 77ms/step
1/1 [==============================] - 0s 105ms/step
1/1 [==============================] - 0s 103ms/step
1/1 [==============================] - 0s 108ms/step
1/1 [==============================] - 0s 71ms/step
1/1 [==============================] - 0s 76ms/step
1/1 [==============================] - 0s 68ms/step
1/1 [==============================] - 0s 76ms/step
1/1 [==============================] - 0s 64ms/step
1/1 [==============================] - 0s 62ms/step
1/1 [==============================] - 0s 81ms/step
1/1 [==============================] - 0s 77ms/step
1/1 [==============================] - 0s 72ms/step
1/1 [==============================] - 0s 64ms/step
1/1 [==============================] - 0s 72ms/step
1/1 [==============================] - 0s 79ms/step
1/1 [==============================] - 0s 73ms/step
1/1 [==============================] - 0s 63ms/step
1/1 [==============================] - 0s 71ms/step
1/1 [==============================] - 0s 67ms/step
1/1 [==============================] - 0s 80ms/step
1/1 [==============================] - 0s 71ms/step
1/1 [==============================] - 0s 71ms/step
1/1 [==============================] - 0s 68ms/step
1/1 [==============================] - 0s 73ms/step
1/1 [==============================] - 0s 66ms/step
1/1 [==============================] - 0s 62ms/step
1/1 [==============================] - 0s 57ms/step
1/1 [==============================] - 0s 65ms/step
1/1 [==============================] - 0s 70ms/step
1/1 [==============================] - 0s 72ms/step
1/1 [==============================] - 0s 56ms/step
1/1 [==============================] - 0s 74ms/step
1/1 [==============================] - 0s 64ms/step
1/1 [==============================] - 0s 56ms/step
1/1 [==============================] - 0s 70ms/step
1/1 [==============================] - 0s 72ms/step
1/1 [==============================] - 0s 76ms/step
1/1 [==============================] - 0s 71ms/step
1/1 [==============================] - 0s 62ms/step
Total predictions: 256
Correct predictions: 254
Incorrect predictions: 2
Model saved successfully.
C:\Users\ayush\anaconda3\lib\site-packages\keras\src\engine\training.py:3000: UserWarning: You are saving your model as an HDF5 file via `model.save()`. This file format is considered legacy. We recommend using instead the native Keras format, e.g. `model.save('my_model.keras')`.
  saving_api.save_model(
In [ ]: